// import 'dart:async';
// import 'dart:convert';
// import 'dart:typed_data';
//
// import 'package:download/download.dart';
// import 'package:file_picker/file_picker.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_lib/utils/LogUtils.dart';
// import 'package:flutter_lib/utils/ShowDialogUtils.dart';
// import 'package:flutter_lib/utils/ToastUtils.dart';
// import 'package:flutter_my_web/widget/BlueMaterialButton.dart';
// import 'package:flutter_my_web/widget/TextWidget.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
// import 'package:get/get.dart';
//
// import 'server_utils/PeerBean.dart';
// import 'server_utils/signaling.dart';
//
// //web websocket  wss://101.200.176.152:8086/ws   ws://101.200.176.152:8086/ws
// class ServerLogic extends GetMaterialController {
//   String host = "101.200.176.152";
//   Signaling? _signaling;
//   RTCDataChannel? _dataChannel;
//   Session? _session;
//   bool _inCalling = false;
//   List<PeerBean> peers = [];
//   String? selfId;
//
//   @override
//   void onInit() {
//     super.onInit();
//     _connect();
//   }
//
//   @override
//   void onDetached() {
//     super.onDetached();
//   }
//
//   @override
//   void onClose() {
//     super.onClose();
//     _signaling?.close();
//   }
//
//   void invitePeer(context, peerId) async {
//     if (peerId != selfId) {
//       _signaling?.invite(peerId, 'data', false);
//     } else {
//       ToastUtils.showToast("不能操作自己");
//     }
//   }
//
//   hangUp() {
//     _signaling?.bye(_session!.sid);
//   }
//
//   void sendMessage(String message) {
//     if (_dataChannel != null) {
//       Map<String, dynamic> all = {};
//       all["type"] = "text";
//       all["content"] = message;
//       _dataChannel?.send(RTCDataChannelMessage(jsonEncode(all)));
//     } else {
//       ToastUtils.showToast("发送数据异常");
//     }
//   }
//
//   bool? isNeedSend;
//   int waitCount = 0;
//
//   Future<void> sendFile() async {
//     var retPaths = await FilePicker.platform.pickFiles(allowMultiple: false);
//     if (retPaths != null && retPaths.count > 0) {
//       LogUtils.e("选择文件：${retPaths.files[0].name}");
//
//       _dataChannel!
//           .send(RTCDataChannelMessage.fromBinary(retPaths.files[0].bytes!));
//       return;
//
//       var map = {};
//       map["type"] = "file";
//       map["name"] = retPaths.files[0].name;
//       map["fileLen"] = retPaths.files[0].bytes!.length;
//       _dataChannel?.send(RTCDataChannelMessage(jsonEncode(map)));
//       ShowDialogUtils().showLoading(Get.context, title: "等待接收文件");
//       waitCount = 0;
//       isNeedSend = null;
//       Timer.periodic(Duration(seconds: 1), (t) {
//         waitCount++;
//         if (isNeedSend == null && waitCount > 30) {
//           t.cancel();
//           ToastUtils.showToast("超时");
//           ShowDialogUtils().disLoading();
//           return;
//         }
//         if (isNeedSend == false) {
//           ToastUtils.showToast("用户取消操作");
//           t.cancel();
//           ShowDialogUtils().disLoading();
//           return;
//         }
//         if (isNeedSend == true) {
//           ToastUtils.showToast("开始传输");
//           t.cancel();
//           ShowDialogUtils().disLoading();
//           ShowDialogUtils().showLoading(Get.context,
//               title: "开始传输:${retPaths.files[0].bytes!.length}");
//           _dataChannel!
//               .send(RTCDataChannelMessage.fromBinary(retPaths.files[0].bytes!));
//           ShowDialogUtils().disLoading();
//           return;
//         }
//       });
//     } else {
//       ToastUtils.showToast("没有选择文件");
//     }
//   }
//
//   String? fileName;
//
//   void _connect() async {
//     _signaling ??= Signaling(host);
//
//     //data 接受地方
//     _signaling?.onDataChannelMessage =
//         (_, dc, RTCDataChannelMessage data) async {
//       if (data.isBinary == true) {
//         LogUtils.e("接收文件");
//         ShowDialogUtils().showLoading(Get.context, title: "接收数据");
//         await download(Stream.fromIterable(data.binary.toList()), "111");
//         ShowDialogUtils().disLoading();
//         ToastUtils.showToast("传输完成");
//         return;
//       }
//       var json = jsonDecode(data.text);
//       var type = json['type'];
//       LogUtils.e("onDataChannelMessage:${data.text} ");
//       switch (type) {
//         case "file":
//           {
//             Get.dialog(AlertDialog(
//               actions: [
//                 BlueMaterialButton('确定', () {
//                   var map = {};
//                   map["type"] = "file_response";
//                   map["accept"] = true;
//                   fileName = json['name'];
//                   _dataChannel?.send(RTCDataChannelMessage(jsonEncode(map)));
//                   Get.back();
//                 }),
//                 BlueMaterialButton('取消', () {
//                   var map = {};
//                   map["type"] = "file_response";
//                   map["accept"] = false;
//                   _dataChannel?.send(RTCDataChannelMessage(jsonEncode(map)));
//                   Get.back();
//                 }),
//               ],
//               content: SimpleText("是否接收文件${json['name']}"),
//             ));
//             break;
//           }
//         case "file_response":
//           {
//             isNeedSend = json['accept'];
//             break;
//           }
//         case "text":
//           {
//             ToastUtils.showToast(json['content']);
//             break;
//           }
//       }
//     };
//
//     _signaling?.onDataChannel = (_, channel) {
//       LogUtils.e("have _dataChannel: ${channel.id} ${channel.label}");
//       _dataChannel = channel;
//     };
//
//     _signaling?.onSignalingStateChange = (SignalingState state) {
//       LogUtils.e("ServerLogic SignalingState:$state");
//       switch (state) {
//         case SignalingState.ConnectionClosed:
//         case SignalingState.ConnectionError:
//         case SignalingState.ConnectionOpen:
//           break;
//       }
//     };
//
//     _signaling?.onCallStateChange = (Session session, CallState state) {
//       LogUtils.e("onCallStateChange:$state");
//       switch (state) {
//         case CallState.CallStateNew:
//           {
//             _session = session;
//             _inCalling = true;
//             break;
//           }
//         case CallState.CallStateBye:
//           {
//             peers.forEach((element) {
//               if (element.id == _session!.pid) {
//                 element.isCall = false;
//               }
//             });
//             _dataChannel = null;
//             _inCalling = false;
//             _session = null;
//             break;
//           }
//         case CallState.CallStateInvite:
//           break;
//         case CallState.CallStateConnected:
//           LogUtils.e("CallStateConnected: ${_session!.sid} ${_session!.pid}");
//           peers.forEach((element) {
//             if (element.id == _session!.pid) {
//               element.isCall = true;
//             }
//           });
//           break;
//         case CallState.CallStateRinging:
//           if (_session != null) {
//             LogUtils.e(
//                 "CallStateRinging:accept == ${_session!.sid} ${_session!.pid}");
//             _signaling?.accept(_session!.sid);
//
//             peers.forEach((element) {
//               if (element.id == _session!.pid) {
//                 element.isCall = true;
//               }
//             });
//           } else {
//             LogUtils.e("CallStateRinging:_session == null");
//           }
//           break;
//       }
//       refresh();
//     };
//
//     _signaling?.onPeersUpdate = ((event) {
//       selfId = event['self'];
//       peers = [];
//       (event['peers'] as List).forEach((element) {
//         var peerBean = PeerBean.fromJson(element);
//         peerBean.isShelf = peerBean.id == selfId;
//         peers.add(peerBean);
//         refresh();
//       });
//     });
//     _signaling?.connect();
//   }
// }
